Google FCM 离线推送简明教程 | 您所在的位置:网站首页 › FCM推送 用户不在线 服务器会保留多长时间 › Google FCM 离线推送简明教程 |
FCM,即Firebase Cloud Messaging Firebase,Firebase是一家实时后端数据库创业公司,它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月Google收购Firebase以来,用户可以在更方便地使用Firebase的同时,结合Google的云服务。 Google在今天2016的I/O大会上发表新版Firebase,Firebase是专为行动应用开发者所提供的后端服务平台(Backend as a Services,BaaS)。新版Firebase增加了免费的数据分析工具、云端讯息推播、通知系统、当机报告、远端配置及动态连结等功能,是继2014年10月Google收购Firebase后,18个月以来的一次大改版。 Android Studio2.2中开始支持Firebase服务,如AdMob、分析、认证和通知等。 一、FCM初认识我们知道,当我们应用被强杀之后,基本上就是收不到推送消息啦,或者说叫离线推送。不管是极光,腾讯信鸽还是阿里推送等,都是基本上对强杀无解,虽然第三方推送有各种奇技淫巧,但是只是杯水车薪。 而iOS在离线消息十分靠谱,那是因为每一个苹果可以通过自家服务器维持一个长链接,每一个iOS的推送都必须和苹果打交道,所以这个过程控制得很好。 Google的自己也是维护一套推送系统,境外开发者基本推送走的是Google的服务,但是由于哈哈哈哈的关系,在国内我们无法使用Google的服务,收不到Google的推送,也因此特殊环境下第三方推送群起,但是强杀之后收到离线消息依然弱爆,除了Google。 Google以前的推送叫GCM,后来收购FireBase退出的FCM是GCM的升级版,本质用的还是GCM. GCM (Google Cloud Message for Android)是Google发布的Android服务器推送(push)技术。 FCM是谷歌推出的最新的Android系统级别的消息推送服务(用来替换GCM)。 二、接入FCM 二.1、前提想要使用FCM,需要满足如下几个条件 设备必须是android4.0以上,Google Play Services 必须是 11.2.0以上版本 Android SDK Manager 必须有Google Play services SDK Android Studio必须是1.5以上版本其中的难处,就是用户手机必须可以连得上Google Play Services ,这个问题嘛,交给历史,如果你的app是面向境外的,那么一切是如此地丝滑。 二.2、 接入什么都别说啦,赶紧看一下Firebase FCM接入文档 本文是按照文档接入测试的,你可以自己去看啊,没错啊,到这里你就可以选择关闭页面,如果你愿意看,那么,continue。 二.2.1、在Firebase控制台添加自己的应用首先你得有一个Google账号嘛,然后登录Firebase的控制台 创建应用 image.png. 选择添加到安卓应用 image.png. 下载生成的文件名为 “google-services.json”的文件,放在应用级别的文件目录下 image.png. image.png期间有个添加包名和sha-1值的过程,此时添加的是debug的sha-1,最好在添加完成之后进入设置把release的sha-1值也添加进去。然后重新下载更新的“google-services.json”,重新替换到项目里面。 . 二.2.2、添加使用Firebase SDK以当前工程没使用过Google Services为例子 需要在工程级gradle文件和应用级的gradle文件上操作。 添加SDK项目gradle buildscript → dependencies classpath 'com.google.gms:google-services:3.1.0' (最新版本可根据官网文档) allprojects → repositories maven { url 'https://maven.google.com' } 这点官网无涉及,但是没加可能会报异常 Failed to resolve: com.google.firebase:firebase-messaging:11.2.0 image.png. . 应用gradle dependencies compile 'com.google.firebase:firebase-messaging:11.2.0' compile 'com.google.gms:google-services:3.1.0'. 在文件的最后添加 apply plugin: 'com.google.gms.google-services'这样代码不要有洁癖放在顶部,想着所有的apply plugin都放一起,不然很大可能报大概如下错误 Please fix the version conflict either by updating the version of the google-services plugin (information about the latest version is available at https://bintray.com/android/android-tools/com.google.gms.google-services/) or updating the version of com.google.android.gms to 9.0.0.. image.png题外话 如果同时也引入google map,firebase的版本要一致,比如如下 // 下方的firebase-messaging 和 play-services-maps 和 play-services版本号必须一致 compile 'com.google.firebase:firebase-messaging:11.2.0' compile 'com.google.android.gms:play-services-maps:11.2.0' compile 'com.google.android.gms:play-services:11.2.0'// 添加之 compile 'com.google.gms:google-services:3.1.0' 配置FireBase SDK唯一Token的获取和上传 最初启动您的应用时,FCM SDK 会为客户端应用实例生成一个注册令牌。如果您希望定位单台设备或创建设备组,则需要通过继承 FirebaseInstanceIdService 来访问此令牌。 当您需要检索当前令牌时,请调用 FirebaseInstanceId.getInstance().getToken() 如果令牌尚未生成,此方法将返回 null。 . . 消息的接收监听 MyFirebaseMessagingService /** * User: LJM * Date&Time: 2017-08-25 & 10:50 * Describe: 消息接收服务 * 推送分为 dataMessage和notification 两种 */ public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "FBTEST"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); Log.d(TAG, "收到推送 From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "收到推送 Message data payload: " + remoteMessage.getData()); } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "收到通知 Message Notification Body: " + remoteMessage.getNotification().getBody()); } } }. . token变化的监听 MyFirebaseInstanceIDService /** * User: LJM * Date&Time: 2017-08-25 & 10:48 * Describe: 实例化令牌服务 * 处理创建,轮询更新Token,当我们推送到执行设备或者设备组的时候就需要用到这个 */ public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = "FBTEST"; @Override public void onTokenRefresh() { super.onTokenRefresh(); String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "刷新Token Refreshed token: " + refreshedToken); // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // Instance ID token to your app server. sendRegistrationToServer(refreshedToken); } /** * Persist token to third-party servers. * * Modify this method to associate the user's FCM InstanceID token with any server-side account * maintained by your application. * * @param token The new token. */ private void sendRegistrationToServer(String token) { // TODO: Implement this method to send token to your app server. } }注册令牌可能会在发生下列情况时更改: 应用删除实例 ID 应用在新设备上恢复 用户卸载/重新安装应用 用户清除应用数据。所以Firebase强烈建议我们复写onTokenRefresh方法并且及时上传更新的Token通知自家服务器 注册service .清单文件注册service . . 至此,配置完成,就等着接消息啦。 三、接收推送控制台发消息,只可以发Notification,但是也足够我们测试啦 (dataMessage必须服务器代码发) 控制台. image.png发送即可收到。 对于 Notification,当app处于前台的是不会接收,至于当app处于后台或者被强杀时收到,嗯,强杀后能收到。而dataMessage是前后台都能收到。 经测试,Pixel 运行Oreo 完美接收,但是如果是其他厂商的机型,想要强杀后继续收到离线消息,一般需要在设置一下 小米【MIUI】 自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启 通知栏设置:应用默认都是显示通知栏通知,如果关闭,则收到通知也不会提示 网络助手:可以手动禁止已安装的第三方程序访问2G/3G和WIFI的网络和设置以后新安装程序是否允许访问2G/3G和WIFI的网络 MIUI 7 神隐模式: 允许应用进行自定义配置模式,应用在后台保持联网可用,否则应用进入后台时,应用无法正常接收消息。【设置】下电量和性能中【神隐模式】华为【Emotion】 自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程不会开启,只能手动开启应用 后台应用保护:需要手动把应用加到此列表,否则设备进入睡眠后会自动杀掉应用进程,只有手动开启应用才能恢复运行 通知管理:应用状态有三种:提示、允许、禁止。禁止应用则通知栏不会有任何提醒魅族【Flyme】 自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启 通知栏推送:关闭应用通知则收到消息不会有任何展示 省电管理: 安全中心里设置省电模式,在【待机耗电管理】中允许应用待机时,保持允许,否则手机休眠或者应用闲置一段时间,无法正常接收消息。VIVO【Funtouch OS】 内存一键清理:需要将应用加入【白名单】列表,否则系统自带的“一键加速”,会杀掉进程 自启动管理:需要将应用加入“i管家”中的【自启动管理】列表,否则重启手机后进程不会自启。但强制手动杀进程,即使加了这个列表中,后续进程也无法自启动。OPPO【ColorOS】 冻结应用管理:需要将应用加入纯净后台,否则锁屏状态下无法及时收到消息 自启动管理:将应用加入【自启动管理】列表的同时,还需要到设置-应用程序-正在运行里锁定应用进程,否则杀进程或者开机后进程不会开启,只能手动开启应用三星 内存一键优化:需要将应用加入【白名单】列表,否则系统内存优化后,会杀掉应用进程小米【MIUI】 自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启 通知栏设置:应用默认都是显示通知栏通知,如果关闭,则收到通知也不会提示 网络助手:可以手动禁止已安装的第三方程序访问2G/3G和WIFI的网络和设置以后新安装程序是否允许访问2G/3G和WIFI的网络 MIUI 7 神隐模式: 允许应用进行自定义配置模式,应用在后台保持联网可用,否则应用进入后台时,应用无法正常接收消息。【设置】下电量和性能中【神隐模式】华为【Emotion】 自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程不会开启,只能手动开启应用 后台应用保护:需要手动把应用加到此列表,否则设备进入睡眠后会自动杀掉应用进程,只有手动开启应用才能恢复运行 通知管理:应用状态有三种:提示、允许、禁止。禁止应用则通知栏不会有任何提醒魅族【Flyme】 自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启 通知栏推送:关闭应用通知则收到消息不会有任何展示 省电管理: 安全中心里设置省电模式,在【待机耗电管理】中允许应用待机时,保持允许,否则手机休眠或者应用闲置一段时间,无法正常接收消息。VIVO【Funtouch OS】 内存一键清理:需要将应用加入【白名单】列表,否则系统自带的“一键加速”,会杀掉进程 自启动管理:需要将应用加入“i管家”中的【自启动管理】列表,否则重启手机后进程不会自启。但强制手动杀进程,即使加了这个列表中,后续进程也无法自启动。OPPO【ColorOS】 冻结应用管理:需要将应用加入纯净后台,否则锁屏状态下无法及时收到消息 自启动管理:将应用加入【自启动管理】列表的同时,还需要到设置-应用程序-正在运行里锁定应用进程,否则杀进程或者开机后进程不会开启,只能手动开启应用三星 内存一键优化:需要将应用加入【白名单】列表,否则系统内存优化后,会杀掉应用进程设置方式引自极光推送文档,侵删 对应设置后,华为荣耀7,P9,�三星等均能接收离线消息。 四、服务器参见文档 end |
CopyRight 2018-2019 实验室设备网 版权所有 |